回到Mirror的使用學習上,這一、二天在網路上找到了不錯的教學影片,跟著前人的腳步走一定可以學的比較多。就利用今天這篇文章記錄一下跟著教學的往下開發的方式。
影片中的開發者開始用Unity New Input System,距離官方認為可以用於正式專案的時間也快半年了,不過有時為省時間,還是只用現行的Input,但影片裡用了新的輸入方式,那就跟著一起換到新的操作方法上。
利用Unity Package Manger進行Input System拿取,由於預設的專案只使用原先的輸入方式,故Package下載完後Unity會要求變更設定後重新啓動。
產生新的輸入需要的Input Action Asset檔後就可進行移動動作的增加。這裡就跟著教學影片走,讓Move是以Vector 2D Composite的方式被定義就可以用類似於原先的
方式進行使用。
前一、二用的最簡易的Transform移動方式,也趁著這次調整成Character Controller。而在教學裡看到了
這二個新的Attribute,不難理解是在Client端才有做用的。但看到了加在Update()
前的Client Attribute,就在想同樣是繼承NetworkBehaviour
的子類別,若是在Update
前加Client Attribute那就只會於Client端做動作,而卻實改成了這樣的寫法後,玩家的畫面又不再同步(好不容易前天才調到同步的)。但這裡帶出了幾個想法。
其一是如果在Update()
前加上Server Attribute,照理說它是在Server端端的更新,一定是會被反應到Client端,也就是說只加在Server端的更新就可以保證二端都正確,但又看了一下,目前的Control機制都是放在Client端,但cached住的控制值,也就是previousInput
並沒有加上SyncVar,也就是它只存在於某個地方。因此,在這樣的寫法下,就算加了Server Attribute到Update()
前,可能也沒有用。
其二是如果都不加Server或是Client Attribute,那它是不是二邊都會有一份在執行。雖然在語法的正確性下不可能寫出
[Client]
void Update() {}
[Server]
void Update() {}
但會不會有什麼樣的情況下,會需要二方有著不同的更新行為。是不是有提供著像是
void Update()
{
// Provided?
if (isServer) {}
if (isClient) {}
// This is known
if (isLocalPlayer) {}
}
的API,以方便區分是在Server端和Client端。
而第三點是拿Input Action Asset來說,它肯定是二方各有一份。而它的特性是用動作綁硬體操控的想法來實現行為,如果是可以用動作綁事件的方式進行,那是不是可以用這樣的想法放到Server端來製作AI?就現在對於New Input System的了解似乎還沒有辦法,但有可能之後可以調整。到時玩家和AI就可以有統一的操控接口。
第四點一樣是Input Action Asset的延伸出來的想法。在以往Client和Server不同語言的時候,沒有同一份資料二端同時擁有。用Unity開發時會發現,有些資料存在Client端是比較有意義的,而有些資料是存在於Server端是比較有義意的,而有些是需要同時存在於二端才行。就拿玩家角色來說,模型要存在Client端才看的到,但在Server端,模型就沒有義意。但Collider,則是二方都需要。而輸入控制的部份,似乎要看遊戲規則來定?
看樣子隨著接觸Mirror的時間慢慢地增加,疑問也會逐漸變多。不知會不會再隨著時間的推移而解開這些疑惑。
回到教學影片這,目前的狀態就是Client和Server不再同步,但看到影片後面的展示,二端是同步的。這表示一定是前面的教學影片裡一定有著和範例不一樣的撰寫或是設定。本來想說可以看一段後直接抽取需要的部來引用,加快遊戲的製作,實際上,改完後雖然好像不錯,但行為就變得不正確。看樣子,只能找一部部往回看,把那段遺失的Code填補回來。
加入了New Input System和Character Controller是不錯的,但同步變得非常的不正確,再加上更了解Mirror一些後產生的問題,也要花時間了解。今天告一段落,要再花時間消化這些概念。